package basic.com.liz.mongo.service;

import java.util.Collection;
import java.util.List;

import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

/**
 * <一句话功能简述>
 * 
 * @author 陆小凤
 * @version [版本号, 2016年2月26日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public interface MongoDBDao
{
    /**
     * 通过条件查询实体
     * 
     * @param query
     * @param collectionName
     * @return
     */
    public <T> List<T> find(Query query, Class<T> classOfT, String collectionName);
    
    /**
     * 在指定集合中查询某个实体类的所有记录
     * 
     * @param collectionName
     * @return
     */
    public <T> List<T> findAll(Class<T> classOfT, String collectionName);
    
    /**
     * 根据条件在指定集合中查询出一条数据
     * 
     * @param query
     * @param collectionName
     * @return
     */
    public <T> T findOne(Query query, Class<T> classOfT, String collectionName);
    
    /**
     * 返回在指定集合中跟ID相同的文档
     * 
     * @param id
     * @param collectionName
     * @return
     */
    public <T> T findById(Object id, Class<T> classOfT, String collectionName);
    
    /**
     * 返回在指定集合中符合查询条件的文档个数
     * 
     * @param query
     * @param collectionName
     * @return
     */
    public long getCount(Query query, String collectionName);
    
    /**
     * 删除指定的集合
     * 
     * @param collectionName
     */
    public void dropCollection(String collectionName);
    
    /**
     * 更新在指定集合中找到的第一条数据
     * 
     * @param query
     * @param update
     * @param collectionName
     */
    public void updateFirst(Query query, Update update, String collectionName);
    
    /**
     * 更新在指定集合中找到的所有对象
     * 
     * @param query
     * @param update
     * @param collectionName
     */
    public void updateMulti(Query query, Update update, String collectionName);
    
    /**
     * 执行更新插入 如果没有发现符合查询条件的文档，则用查询条件和更新内容创建一个新文档，插入
     * 
     * @param query
     * @param update
     * @param collectionName
     */
    public void upsert(Query query, Update update, String collectionName);
    
    /**
     * 在指定集合中删除对象
     * 
     * @param object
     * @param collection
     */
    public <T> void remove(T object, String collection);
    
    /**
     * 删除指定集合中所有符合查询条件的文档
     * 
     * @param query
     * @param collectionName
     */
    public void remove(Query query, String collectionName);
    
    /**
     * 在指定集合中批量插入
     * 
     * @param batchToSave
     * @param collectionName
     */
    public <T> void insert(Collection<T> batchToSave, String collectionName);
    
    /**
     * 在指定集合中插入对象
     * 
     * @param objectToSave
     * @param collectionName
     */
    public <T> void insert(T objectToSave, String collectionName);
    
    /**
     * 在指定集合中插入对象,如果存在就覆盖，不存在就新插入
     * 
     * @param objectToSave
     * @param collectionName
     */
    public <T> void save(T objectToSave, String collectionName);
    
    /**
     * 根据集合名称删除集合
     * 
     * @param collectionName
     */
    public <T> void drop(String collectionName);
}
